<?php

/*
 * 引入框架的核心文件
 * 这里显式引用是为了提高必须类库的加载速度
 * 无需使用自动加载去搜索类库 
 * 实际不显式加载而使用自动加载也是可以的
 */

require CORE_PATH . '/Sys.php';
require CORE_PATH . '/Controller.php';
require CORE_PATH . '/Dispatcher.php';
require CORE_PATH . '/Request.php';
require CORE_PATH . '/Route.php';
require CORE_PATH . '/Func.php';

// 加载自定义函数库
if (file_exists(APP_PATH . '/functions.php')) {
    require APP_PATH . '/functions.php';
}

class Application {

    /**
     * 初始化框架并运行APP
     */
    public function run($dispatch = true) {
        // 系统初始化
        $this->_initSys($dispatch);
        // APP初始化
        $this->_initApp($dispatch);
        // 执行调配器
        $dispatch && $this->_dispatch();
    }

    /**
     * 系统初始化
     *
     */
    private function _initSys($dispatch = true) {
        // 错误最高级别
        error_reporting(E_ALL);
        // 自定义PHP错处处理
        set_error_handler(array('Sys', '_error'));
        // 初始化自动装载器
        spl_autoload_register(array('Sys', '_autoload'));

        // 支持Composer自动加载
        if (file_exists(ROOT_PATH . '/vendor/autoload.php')) {
            require ROOT_PATH . '/vendor/autoload.php';
        }

        // 异常处理
        set_exception_handler(array('Sys', '_exception'));

        // 命令行模式参数解析
        $dispatch && Sys::_checkSapi();
    }

    /**
     * 应用程序初始化
     *
     */
    private function _initApp($dispatch = true) {
        // 得到APP配置
        $appCfg = Sys::getCfg();
        // 设置时区
        date_default_timezone_set($appCfg['timezone']);
    }

    /**
     * 执行调配器
     *
     */
    private function _dispatch() {
        $dispatcher = new Dispatcher();
        $dispatcher->run();
    }

}
